;;; af
;;; Language: R5RS

(define (p) (p))

(define (test x y)
  (if (= x 0)
      0
      y))

; Um interpretador que faz uso de applicative-order evaluation avalia a expressão e aplica as funções sobre os argumentos, mesmo que ainda não seja necessário. Isso faz com que a função 'p', que é recursiva, seja avaliada 'infinitamente'.

; (test 0 (p))
; recursão em (p)

; Um interpretador que faz uso de normal-order evaluation primeiro expande o máximo que pode as expressões para então realizar a redução, realizando a avaliação somente se necessário. Nesse caso, a função 'teste' retorna o valor 0, não sendo necessário avaliar a função 'p'.

; (test 0 (p))
; (if (= x 0) 0 y)
; (if (= 0 0) 0 (p))
; (if #t 0 (p))
; 0
